package org.xlh.springboot.result;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.xlh.springboot.enums.CodeEnum;

/**
 * 统一的WEB层返回数据，统一格式，降低前后端沟通成本
 * @param <T>
 */
@Builder //建造模式
@Data
@AllArgsConstructor
@NoArgsConstructor
public class R<T> {
    //响应的状态码
    private Integer code;
    //响应的消息描述
    private String msg;
    //响应的对象
    private T data;

    //为了方便返回数据，这里一般都是静态方法
    //方法一般包括两大类，一类是成功的返回，一类是失败的返回
    //响应成功的消息，但是不携带数据
//    public static <T> R<T> OK() {
//        return R.<T>builder()
//                .code(200)
//                .msg("成功")
//                .build();
//    }

    public static <T> R<T> OK() {
        return R.<T>builder()
                .code(CodeEnum.OK.getCode())
                .msg(CodeEnum.OK.getMsg())
                .build();
    }

    //响应成功的消息，并且携带数据
    public static <T> R<T> OK(T data) {
        return R.<T>builder()
                .code(CodeEnum.OK.getCode())
                .msg(CodeEnum.OK.getMsg())
                .data(data)
                .build();
    }

    //响应失败的消息，默认的状态码是400，失败的消息是：失败
    //失败是不可能携带数据的
    public static <T> R<T> FAIL() {
        return R.<T>builder()
                .code(CodeEnum.FAIL.getCode())
                .msg(CodeEnum.FAIL.getMsg())
                .build();
    }

    //响应失败的消息，但是可以自定义状态码和消息
//    public static <T> R<T> FAIL(Integer code, String msg) {
//        return R.<T>builder()
//                .code(code)
//                .msg(msg)
//                .build();
//
//    }

    public static <T> R<T> FAIL(CodeEnum codeEnum) {
        return R.<T>builder()
                .code(codeEnum.getCode())
                .msg(codeEnum.getMsg())
                .build();

    }
}
